package com.xjc.listener;

import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEntityEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.stereotype.Component;

/**
 * <p>
 * 任务监听器
 * </p>
 *
 * @author xiaojincai
 * @since 2025-06-12
 */
@Slf4j
@Component
public class ProcessTaskListener implements FlowableEventListener {

    @Override
    public void onEvent(FlowableEvent event) {
        log.debug("任务监听器开始执行");
        if(!(event instanceof final FlowableEntityEvent entityEvent)){
            return;
        }
        if(!(entityEvent.getEntity() instanceof final TaskEntity task)) {
            return;
        }

        if (event.getType() instanceof FlowableEngineEventType type) {
            switch (type) {
                case TASK_CREATED -> firstCreatHandle(task);
                case TASK_COMPLETED -> completeHandle(task);
                default -> log.info("任务类型：{}", type);
            }
        }

    }

    /**
     * 首次创建时触发
     *
     * @param task 任务
     */
    private void firstCreatHandle(TaskEntity task) {
        log.info(">>>>>>>>>>>>>>>>>任务创建，任务状态：{}, 待处理人：{}, 任务变量：{}, 全局变量：{},任务信息：{}",
                task.getState(), task.getAssignee(), task.getVariablesLocal(), task.getVariables(), task);
        //任务创建时，只有创建时间，其余时间都为空
        log.info(">>>>>>>>>>>>>>>>>任务创建，任务时间：{}, {}, {}, {}, {}, {}",
                task.getCreateTime(), task.getSuspendedTime(), task.getDueDate(), task.getInProgressStartDueDate(), task.getInProgressStartTime(), task.getClaimTime());
    }

    /**
     * 完成任务时处理
     *
     * @param task 任务
     */
    private void completeHandle(TaskEntity task) {
        log.info(">>>>>>>>>>>>>>>>>任务完成，任务状态：{}, 待处理人：{}, 任务变量：{}, 全局变量：{},任务信息：{}",
                task.getState(), task.getAssignee(), task.getVariablesLocal(), task.getVariables(), task);
        log.info(">>>>>>>>>>>>>>>>>任务完成，任务时间：{}, {}, {}, {}, {}, {}",
                task.getCreateTime(), task.getSuspendedTime(), task.getDueDate(), task.getInProgressStartDueDate(), task.getInProgressStartTime(), task.getClaimTime());
    }

    @Override
    public boolean isFailOnException() {
        return true;
    }

    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return true;
    }

    @Override
    public String getOnTransaction() {
        return getClass().getSimpleName() + "_" + System.currentTimeMillis();
    }
}
